package com.shujia.scala

object Demo20ScalaMatch {
  /**
   * 模式匹配 match
   * java中的模式匹配可以匹配 基本数据类型的值、字符串、枚举
   * scala中的模式匹配可以匹配 基本数据类型的值、字符串、枚举、对象、类型
   */

  def main(args: Array[String]): Unit = {

    // 1、匹配基本数据类型的值
    val i: Int = 3

    i match {
      case 1 => println("i的值为" + 1)
      case 2 => println("i的值为" + 2)
      case 3 => println("i的值为" + 3)
      case _ => println("其他情况")
    }

    // 2、匹配字符串
    val str: String = "abcde"

    str match {
      case "abcd" => println("abcd")
      case "abcde" => println("abcde")
      case "abcdf" => println("abcdf")
      case "abcdg" => println("abcdg")
      case _ => println("其他情况")
    }

    // 4、匹配对象（样例类的对象）
    val zhangSan: StuC = StuC("001", "zhangSan")
    zhangSan match {
      case StuC("001", "zhangSan") => println("zhangSan")
      case StuC("002", "zhangSan") => println("zhangSan2")
      case StuC("003", "xiaoming") => println("xiaoming")
      case _ => println("其他情况")
    }

    // 5、匹配类型
    // Any相当于Object
    val str2: Any = "string"

    str2 match {
      case i: Int => println(i)
      case f: Float => println(f)
      case s: String => println(s)
      case _ => println("其他情况")
    }

    // scala中的match可以有返回值
    val smatch: Any = str2 match {
      case i: Int => i
      case f: Float => f
      case s: String => s
      case _ => "其他情况"
    }
    println(smatch)

    // match在Map中的运用
    val map = Map("k1" -> "v1", "k2" -> "v2", "k3" -> "v3")

    // Option 表示有的时候去调用函数去获取值
    // 有时候有返回值 有的时候没有 为了避免直接返回null发生空指针异常
    // 在Scala中就用Option的方式去应对
    // Option下面就两个选项（两个子类） 一个是 Some 另一个是None
    val v: Option[String] = map.get("k1")

    val res = v match {
      case None => "默认值"
      case Some(s) => s
    }
    println(res)
    // 相当于getOrElse
    val res2: String = map.getOrElse("k1", "默认值")
    println(res2)

  }

  case class StuC(id: String, name: String)
}
